package com.techsen.tsweb.sys.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.techsen.tsweb.sys.dao.AclDao;
import com.techsen.tsweb.sys.dao.MenuDao;
import com.techsen.tsweb.sys.dao.OperDao;
import com.techsen.tsweb.sys.domain.Menu;
import com.techsen.tsweb.sys.domain.Oper;
import com.techsen.tsweb.sys.security.Resource;
import com.techsen.tsweb.sys.service.ResourceService;

@Service
public class ResourceServiceImpl implements ResourceService {
    
    @javax.annotation.Resource
    private MenuDao menuDao;
    
    @javax.annotation.Resource
    private OperDao operDao;
    
    @javax.annotation.Resource
    private AclDao aclDao;
    
    /**
     * 根据资源类型，资源组，资源标识获取资源
     * @param type 资源类型
     * @param group 资源组
     * @param sn 资源标识
     */
    @Override
    public Resource getResourceByTypeAndGroupAndSn(String resourceType, String resourceGroup, String resourceSn) {
        Resource resource = null;
        if (Menu.class.getSimpleName().toLowerCase().equals(resourceType)) {
            resource = this.menuDao.get(resourceSn);
        } else if(Oper.class.getSimpleName().toLowerCase().equals(resourceType)) {
            resource = this.operDao.get(resourceSn);
        }
        return resource;
    }

    /**
     * 查找所有资源
     */
    @Override
    public List<Resource> findAll() {
        List<Resource> list = new ArrayList<Resource>();
        list.addAll(this.menuDao.findAll());
        list.addAll(this.operDao.findAll());
        return list;
    }

    /**
     * 根据用户ID获取根据用户授权给该用户的资源ID集合
     */
    @Override
    public Map<String, List<String>> getResourceIdsByUserId(String userId) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        map.put(Menu.class.getSimpleName().toLowerCase(), this.menuDao.getMenuIdsByUserId(userId));
        map.put(Oper.class.getSimpleName().toLowerCase(), this.operDao.getOperIdsByUserId(userId));
        return map;
    }

    /**
     * 根据角色ID获取根据角色授权给该用户的资源ID集合
     */
    @Override
    public Map<String, List<String>> getResourceIdsByRoleId(String roleId) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        map.put(Menu.class.getSimpleName().toLowerCase(), this.menuDao.getMenuIdsByRoleId(roleId));
        map.put(Oper.class.getSimpleName().toLowerCase(), this.operDao.getOperIdsByRoleId(roleId));
        return map;
    }

    /**
     * 根据用户ID获取授权给这个用户的所有资源ID集合<br/>
     * 1. 按用户授权<br/>
     * 2. 按角色授权<br/>
     */
    @Override
    public Map<String, List<String>> getAuthorizedResourceIdsByUserId(String userId) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        map.put(Menu.class.getSimpleName().toLowerCase(), this.menuDao.getAuthorizedMenuIdsByUserId(userId));
        map.put(Oper.class.getSimpleName().toLowerCase(), this.operDao.getAuthorizedOperIdsByUserId(userId));
        return map;
    }
    
}
